//      dlm.h
//      
//      Copyright 2012 Piotr <piotr@piotr-dell>
//      
//      This program is free software; you can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//      the Free Software Foundation; either version 2 of the License, or
//      (at your option) any later version.
//      
//      This program is distributed in the hope that it will be useful,
//      but WITHOUT ANY WARRANTY; without even the implied warranty of
//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//      GNU General Public License for more details.
//      
//      You should have received a copy of the GNU General Public License
//      along with this program; if not, write to the Free Software
//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
//      MA 02110-1301, USA.
#ifndef DLM_H_INCLUDED
#define DLM_H_INCLUDED

#include <stdio.h>
#include <sys/types.h>
#include "common.h"
#include "dlmlists.h"
#include <time.h>
#include <signal.h>

/**
 * Funkcja inicjalizuje cały DLM 
 */
int DLM_init();

/**
 * Główna pętla programu.
 */
int DLM_main_loop();

/**
 * Tworzenie nowego procesu.
 */
pid_t DLM_fork();

/**
 * Zamknięcie deskryptorów, zwolnienie pamięci
 */
int DLM_cleanup();

//===========================//
/* Wysyła odpowiedź do podanego procesu*/
int send_reply(struct message messageToSend, struct child_data recipient);

/* Zakłada blokadę na dany zasób (bez sprawdzenia czy można) */
int lock_resource(int resource_id, int lock_type, struct child_data locker);

/* Usuwa blokadę z danago zasobu i zakłada kolejną z oczekujących */
int unlock_resource(int resource_id, struct child_data unlocker);

/* Przetwarza żądanie i wysyła odpowiedź */
int process_request(message request, child_data sender);

/* Procedura obsługi końca czasu dla DLM_REQ_LOCK z timeoutem, usuwa zapytanie z kolejki czekających i wysyła odpowiedź o niepowodzeniu
 * pole sival_ptr wskazuje na waitera */
void on_timeout(sigval_t value);
#endif
